package com.shop.singleDemo;

public class SingleTest {

    private int value ;
    public static volatile SingleTest instance = null ;

    private SingleTest(){
        this.value = 1024 ;
    }
    //DCL (double check lock) 模式
    public SingleTest getInstance(){
        if (instance == null){
            synchronized (SingleTest.class){
                if (instance == null){
                    instance = new SingleTest(); // 不是原子操作
                    // 1、申请内存
                    // 2、初始化对象
                    // 3、设置instance 指向分配的对象内存地址, 此时 instance != null
                    // 其中2 3 可能发生指令重排，造成先执行3 再执行2，此时 instance != null 但是 instance 对象属性并未赋值，此时value 仍然为0；
                    // 此时可将instance 声明为volatile
                }
            }
        }
        return instance;
    }
}
